package com.gskj.eduservice.service.impl;

import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.gskj.eduservice.entity.EduSubject;
import com.gskj.eduservice.entity.excel.ExcelSubjectData;
import com.gskj.eduservice.entity.subject.FirstSubject;
import com.gskj.eduservice.entity.subject.SecondSubject;
import com.gskj.eduservice.listener.SubjectExcelListener;
import com.gskj.eduservice.mapper.EduSubjectMapper;
import com.gskj.eduservice.service.IEduSubjectService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 课程科目 服务实现类
 * </p>
 *
 * @author testjava
 * @since 2020-05-16
 */
@Service
public class EduSubjectServiceImpl extends ServiceImpl<EduSubjectMapper, EduSubject> implements IEduSubjectService {

    @Override
    public void saveSubject(MultipartFile file, IEduSubjectService iEduSubjectService) {

        try {
            // 获取文件流
            InputStream in = file.getInputStream();
            // 调用 read方法
            EasyExcel.read(in, ExcelSubjectData.class, new SubjectExcelListener(iEduSubjectService))
                    .sheet()
                    .doRead();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public List<FirstSubject> getTreeSubject() {

        // 1.查询所有1级 分类
        QueryWrapper<EduSubject> wrapperFirst = new QueryWrapper<>();
        wrapperFirst.eq("parent_id", "0");
        List<EduSubject> firstSubjectList = baseMapper.selectList(wrapperFirst);

        // 2.查询所有2级 分类
        QueryWrapper<EduSubject> wrapperSecond = new QueryWrapper<>();
        wrapperSecond.ne("parent_id", "0");
        List<EduSubject> secondSubjectList = baseMapper.selectList(wrapperSecond);

        // 创建 最终存放的 一级二级分类 集合
        List<FirstSubject> finalSubjectList = new ArrayList<>();

        // 3.封装 1级
        for (EduSubject eduSubject : firstSubjectList) {
            // 获取每一个 eduSubject
            // 创建 一级实体类用于存放 一级课程信息
            FirstSubject firstSubject = new FirstSubject();

            // 通过 工具类 。将当前遍历的eduSubject的属性 一一对应复制到 firstSubject中
            BeanUtils.copyProperties(eduSubject, firstSubject);

            // 添加到 最终集合中
            finalSubjectList.add(firstSubject);

            // 4.封装 2级
            // 在一级分类循环中 嵌套循环 遍历二级分类集合
            // 创建 存放二级循环的 集合, 即为一级分类中的二级分类集合。
            List<SecondSubject> secondSubjectListTemp = new ArrayList<>();

            // 遍历查询的二级集合
            for (EduSubject secnodSubject : secondSubjectList) {

                // 判断二级分类的parent_id 是否相等 一级分类的id
                if(secnodSubject.getParentId().equals(eduSubject.getId())){

                    // 将 当前遍历的 secnodSubject至 复制到 二级分类 secondSubject2中
                    SecondSubject secondSubject2 = new SecondSubject();

                    BeanUtils.copyProperties(secnodSubject, secondSubject2);
                    // 添加到 集合中
                    secondSubjectListTemp.add(secondSubject2);
                }
            }
            // 将存放的二级分类集合 赋值到 一级分类中的 children 二级集合中
            firstSubject.setChildren(secondSubjectListTemp);
        }
        return finalSubjectList;
    }
}
